/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package BeansGerenciaveis;

import DAO.ImagemDao;
import DAO.NoticiaDAO;
import bean.Imagem;
import bean.Noticia;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author jorgepereira
 */
@ManagedBean
@ViewScoped
public class NoticiaBean {

    /**
     * Creates a new instance of NoticiaBean
     */
    private Noticia noticia;
    private ArrayList<Noticia> noticias;
    private Imagem novaImagem;

    public String getAcao() {
        if (noticia.getId() > 0) {
            return "Alterar";
        } else {
            return "Cadastrar";
        }
    }

    public NoticiaBean() {
        this.noticia = new Noticia();
    }

    public Noticia getNoticia() {
        return noticia;
    }

    public void setNoticia(Noticia noticia) {
        this.noticia = noticia;
    }

    public void doUpload(FileUploadEvent fileUploadEvent) throws IOException {
        UploadedFile uploadedFile = fileUploadEvent.getFile();

        if (uploadedFile.getSize() > 0) {

            if (new ImagemDao().validarCadastroImagem(uploadedFile.getFileName())) {
                this.novaImagem = new Imagem();

                novaImagem.setConteudo(readFully(fileUploadEvent.getFile().getInputstream(), (int) fileUploadEvent.getFile().getSize(), true));
                novaImagem.setFormato(uploadedFile.getContentType());
                System.out.println("Formato:" + novaImagem.getFormato());
                novaImagem.setNome(uploadedFile.getFileName() + new Date());
                System.out.println("Nome Arquivo:" + novaImagem.getNome());
                System.out.println("Id da nova imagem:"+ novaImagem.getId());
                

                FacesContext facesContext = FacesContext.getCurrentInstance();
                facesContext.addMessage(null, new FacesMessage("Aquivo Recebido com Sucesso", ""));
            } else {
                FacesContext facesContext = FacesContext.getCurrentInstance();
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possivel fazer upload:", "Já existe uma imagem cadastrada com esse nome! "));
            }

        } else {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi selecionado um arquivo para upload", ""));

        }

    }

    public void cadastrarAlterarNoticia() {
        System.out.println("Id noticia: " + noticia.getId());
        if(this.novaImagem != null){
            noticia.setImagem(novaImagem);
            System.out.println("Id nova imagem:" + noticia.getImagem().getId() );
          
        }
    
        if (new NoticiaDAO().cadastrarAlterar(noticia) == true) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            if (noticia.getId() > 0) {
                noticia = new NoticiaDAO().selecionar(noticia.getId());
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Notícia alterada com Sucesso", ""));
            } else {

                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Notícia cadastrada com Sucesso", ""));
                this.noticia = new Noticia();
            }
            
        } else {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção", "Ocorreu um erro e não foi possível efetuar a operação"));
        }

    }

    public static byte[] readFully(InputStream is, int length, boolean readAll)
            throws IOException {
        byte[] output = {};
        if (length == -1) {
            length = Integer.MAX_VALUE;
        }
        int pos = 0;
        while (pos < length) {
            int bytesToRead;
            if (pos >= output.length) { // Only expand when there's no room
                bytesToRead = Math.min(length - pos, output.length + 1024);
                if (output.length < pos + bytesToRead) {
                    output = Arrays.copyOf(output, pos + bytesToRead);
                }
            } else {
                bytesToRead = output.length - pos;
            }
            int cc = is.read(output, pos, bytesToRead);
            if (cc < 0) {
                if (readAll && length != Integer.MAX_VALUE) {
                    throw new EOFException("Detect premature EOF");
                } else {
                    if (output.length != pos) {
                        output = Arrays.copyOf(output, pos);
                    }
                    break;
                }
            }
            pos += cc;
        }
        return output;
    }

    public ArrayList<Noticia> getNoticias() {
        if(noticias == null){
            noticias = (ArrayList<Noticia>) new NoticiaDAO().buscarTodasNoticias();
        }
        
        return noticias;
    }

    public void setNoticias(ArrayList<Noticia> noticias) {
        this.noticias = noticias;
    }
    
    public String selecionar() {
        String resultado = "";
        
        this.noticia = new NoticiaDAO().selecionar(this.noticia.getId());
        //disciplina = new DisciplinasGS();
        resultado = "cadastrar?faces-redirect=true&amp;includeViewParams=true";
        return resultado;
    }
    
    public String lerNoticia() {
        String resultado = "";
        
        this.noticia = new NoticiaDAO().selecionar(this.noticia.getId());
        //disciplina = new DisciplinasGS();
        resultado = "/noticias/index?faces-redirect=true&amp;includeViewParams=true";
        return resultado;
    }
    
    

}
